package br.com.upis.sispat.service.impl;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.upis.sispat.dao.Dao;
import br.com.upis.sispat.entity.AlocacaoPatrimonio;
import br.com.upis.sispat.entity.Patrimonio;
import br.com.upis.sispat.entity.Requisicao;
import br.com.upis.sispat.entity.Usuario;
import br.com.upis.sispat.exception.SeamCoreException;
import br.com.upis.sispat.service.AlocacaoPatrimonioService;

@Service("alocacaoPatrimonioService")
public class AlocacaoPatrimonioServiceImpl implements AlocacaoPatrimonioService {

	private static final long serialVersionUID = -652786288562521319L;

	private Dao<Patrimonio> patrimonioDao;

	private Dao<AlocacaoPatrimonio> alocacaoPatrimonioDao;

	@Override
	public List<Patrimonio> listAll() throws SeamCoreException {
		return patrimonioDao.listAll(Patrimonio.class);
	}

	@Autowired
	public void setPatrimonioDao(Dao<Patrimonio> patrimonioDao) {
		this.patrimonioDao = patrimonioDao;
	}

	@Autowired
	public void setAlocacaoPatrimonioDao(
			Dao<AlocacaoPatrimonio> alocacaoPatrimonioDao) {
		this.alocacaoPatrimonioDao = alocacaoPatrimonioDao;
	}

	@Override
	public List<AlocacaoPatrimonio> listAlocacaoPatrimonioByUsuario(Usuario usuario) throws SeamCoreException {
		
		StringBuilder hql = new StringBuilder();
		hql.append(" select an from AlocacaoPatrimonio an ");
		hql.append(" where an.pk.usuario.codigo = ? ");

		return alocacaoPatrimonioDao.list(hql.toString(), usuario.getCodigo().toString());
	}
	
	public List<AlocacaoPatrimonio> listAlocacaoPatrimonioByPatrimonio(Patrimonio patrimonio) throws SeamCoreException {
		
		StringBuilder hql = new StringBuilder();
		hql.append(" select an from AlocacaoPatrimonio an ");
		hql.append(" where an.pk.patrimonio.codigo = ? ");

		return alocacaoPatrimonioDao.list(hql.toString(), patrimonio.getCodigo().toString());
	}

	@Override
	@Transactional
	public void delete(AlocacaoPatrimonio alocacaoPatrimonio) throws SeamCoreException {

		try {
			alocacaoPatrimonioDao.delete(alocacaoPatrimonio);
		} catch (SQLException e) {
			throw new SeamCoreException(e);
		}

	}

	@Override
	@Transactional
	public void save(AlocacaoPatrimonio alocacaoPatrimonio)
			throws SeamCoreException {

		try {
			alocacaoPatrimonioDao.create(alocacaoPatrimonio);
		} catch (SQLException e) {
			throw new SeamCoreException(e);
		}

	}
	@Override
	@Transactional
	public void update(AlocacaoPatrimonio alocacaoPatrimonio)
			throws SeamCoreException {

		try {
			alocacaoPatrimonioDao.update(alocacaoPatrimonio);
		} catch (SQLException e) {
			throw new SeamCoreException(e);
		}

	}

	@Override
	public Patrimonio getPatrimonioById(Long valueOf) {
		return patrimonioDao.getObjectFromId(Patrimonio.class, valueOf);
	}

	@Override
	public List<AlocacaoPatrimonio> search(AlocacaoPatrimonio alocacaoPatrimonio){
		StringBuilder hql = new StringBuilder();
		hql.append(" select an from AlocacaoPatrimonio an ");
		hql.append(" where 1=1 ");
		
		if (alocacaoPatrimonio.getPk().getPatrimonio() != null && alocacaoPatrimonio.getPk().getPatrimonio().getCodigoPatrimonio() != null && alocacaoPatrimonio.getPk().getPatrimonio().getCodigoPatrimonio().length() > 0) {
			hql.append(" and an.pk.patrimonio.codigoPatrimonio = ? ");
		}
		
		if (alocacaoPatrimonio.getPk().getUsuario() != null && alocacaoPatrimonio.getPk().getUsuario().getNomeUsuario() != null && alocacaoPatrimonio.getPk().getUsuario().getNomeUsuario().length() > 0) {
			hql.append(" and an.pk.usuario.nomeUsuario = ? ");
		}
		
		if(alocacaoPatrimonio.getDataAlocacao() != null){
			hql.append(" and an.dataAlocacao = ? ");
		}

		
		int i = 0;

		Session session = alocacaoPatrimonioDao.getSession();

		Transaction tx = session.getTransaction();

		tx.begin();

		Query query = session.createQuery(hql.toString());

		if (alocacaoPatrimonio.getPk().getPatrimonio() != null && alocacaoPatrimonio.getPk().getPatrimonio().getCodigoPatrimonio() != null && alocacaoPatrimonio.getPk().getPatrimonio().getCodigoPatrimonio().length() > 0) {
			query.setString(i++, "%" + alocacaoPatrimonio.getPk().getPatrimonio().getCodigoPatrimonio() + "%");
		}

		if (alocacaoPatrimonio.getPk().getUsuario() != null && alocacaoPatrimonio.getPk().getUsuario().getNomeUsuario() != null && alocacaoPatrimonio.getPk().getUsuario().getNomeUsuario().length() > 0) {
			query.setString(i++, "%" + alocacaoPatrimonio.getPk().getUsuario().getNomeUsuario() + "%");
		}
		if(alocacaoPatrimonio.getDataAlocacao() != null){
			query.setDate(i++, alocacaoPatrimonio.getDataAlocacao());
		}
		List<AlocacaoPatrimonio> lista = query.list();

		tx.commit();

		return lista;
	}

	@Override
	public AlocacaoPatrimonio getById(Long id) throws SeamCoreException {
		return null;
	}

}
